package com.web_bloks.system.client;

import com.google.gwt.core.client.GWT;

/**
 * 
 * @author Jean-Lou Dupont
 *
 */
public class Logger {

	enum Code {
		
		INFO 	{ void run(String msg) { Logger.info(msg);  } },
		DEBUG	{ void run(String msg) { Logger.debug(msg); } },
		ERROR	{ void run(String msg) { Logger.error(msg); } },
		WARN	{ void run(String msg) { Logger.warn(msg);  } };
		
		abstract void run(String msg);
	}
	
	/**
	 * Constructor
	 * For the factory
	 */
	protected Logger() {
	}

	public void LOG(String msg, Code code) {
		code.run(msg);
	}
	
	
	public static void log( String msg ) {
		
		GWT.log(msg, null);
		
		if ( isAvailable() == false )
			return;
		
		logToFirebug( msg );
	}

	public static void logError( String msg ) {
		GWT.log(msg, null);
		if ( isAvailable() == false ) return;
		error(msg);
	}

	public static void logInfo( String msg ) {
		GWT.log(msg, null);
		if ( isAvailable() == false ) return;		
		info(msg);
	}

	public static void logDebug( String msg ) {
		GWT.log(msg, null);
		if ( isAvailable() == false ) return;
		// TODO I am having trouble with Firebug's debug method...
		info(msg);
	}
	
	public static void logWarn( String msg ) {
		GWT.log(msg, null);
		if ( isAvailable() == false ) return;		
		warn(msg);
	}
	
	public static void logDir( Object obj ) {
		
		if ( isAvailable() == false ) return;
		
		if (isDirAvailable())
			dir( obj );
		else
			log( "[DIR not available]" );
	}
	
	public static void log( String msg, Code code ) {
		
		GWT.log(msg, null);
		
		if ( isAvailable() == false )
			return;
		
		switch( code ) {
		case INFO: 
			info(msg); 
			break;
		case DEBUG:
			debug(msg);
			break;
		case ERROR:
			error(msg);
			break;
		case WARN:
			warn(msg);
			break;
		}
		
	}
	
	/**
	 * Returns the availability status
	 * of Firebug console
	 * 
	 * @return boolean
	 */
	protected static native boolean isAvailable() /*-{
	
		return ( typeof console != "undefined" );
		
	}-*/;

	protected static native boolean isDirAvailable() /*-{
	
		return ( typeof console.dir != "undefined" );
	
	}-*/;

	protected static native void logToFirebug( String msg ) /*-{
		console.log( msg );
		
	}-*/;

	protected static native void info( String msg ) /*-{
		console.info( msg );
	
	}-*/;

	/**
	 * Console.debug is not available under Chrome
	 * @param msg
	 */
	protected static native void debug( String msg ) /*-{
		if (typeof console.debug == "undefined")
			console.info( msg );
		else
			console.debug( msg );

	}-*/;

	protected static native void warn( String msg ) /*-{
		console.warn( msg );

	}-*/;
	
	protected static native void error( String msg ) /*-{
		console.error( msg );

	}-*/;

	protected static native void dir( Object o ) /*-{
			console.dir( o );

	}-*/;
	
	
}//end